package kr.pe.johnkim.sendme.activity;

import java.util.ArrayList;
import java.util.List;

import kr.pe.johnkim.sendme.activity.R;
import kr.pe.johnkim.sendme.provider.SendMeFriend;
import kr.pe.johnkim.sendme.provider.SendMeInstall;
import kr.pe.johnkim.sendme.provider.SendMeLog;
import kr.pe.johnkim.sendme.rest.SendMeInstallRest;
import kr.pe.johnkim.sendme.rest.SendMeLogRest;
import kr.pe.johnkim.sendme.util.SendMeActivityManager;
import kr.pe.johnkim.sendme.util.SendMeCommon;
import kr.pe.johnkim.sendme.util.SendMeConstant;
import kr.pe.johnkim.sendme.util.SendMeDBManagerInstallUser;
import kr.pe.johnkim.sendme.util.SlidingDrawer;
import kr.pe.johnkim.sendme.util.SlidingDrawer.OnDrawerOpenListener;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.provider.ContactsContract;
import android.provider.ContactsContract.CommonDataKinds.Im;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;

/**
 * 메인 화면 액티비티 클래스 이다.
 * 
 * @author johnkim
 *
 */
public class SendMeMainActivity extends Activity {

	public static String TAG = SendMeMainActivity.class.getSimpleName();
	
	public static Activity sendMeMainActivityForUpldate;	
	
	// 액티비티 매니저를 가져 온다.
	private SendMeActivityManager sendMeActivityManager = SendMeActivityManager.getInstance();
		
	// 마스터 암호.
	private String MASTER_PASSWORD = "";
	
	// 퍼블릭 암호.
	private String PUBLIC_PASSWORD = "";
	
	// 기능 모드.(MASTER/PUBLIC)
	private String FUNCTION_MODE = "";
	
	// 사용자 휴대 전화번호.
	private String PHONE_NUMBER = "";

	private ProgressDialog dialog;
	
	
	// 로그를 남긴다
	private static final int THREAD_REGISTER_LOG = 100;
	
	// 앱을 종료 한다.
	private static final int ALERT_DIALOG_EXIT_ID = 101;
	
	// 앱을 설치한 사용자 목록을 가져와서 SQLite에 저장한다		selectInstallList
	private static final int THREAD_SELECT_INSTALL_LIST = 102;	
	
	// 안읽은 메시지 표시한다
	private static final int THREAD_SHOW_UNREAD_MESSAGE_COUNT = 103;	
	
	// 프로그레스 바를 출력 한다.
	private static final int THREAD_PROGRESS_BAR_VISIBLE = 105;
		
	// 프로그레스 바를 감춘다.
	private static final int THREAD_PROGRESS_BAR_INVISIBLE = 106;
	
	
	ImageButton imageButtonTopMainMenu;
	
	SlidingDrawer slidingDrawerFrom;
	SlidingDrawer slidingDrawerTo;
	
	// 안읽은 메시지 수
	int unreadCount;
	TextView mainUnreadCountTxt;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		
		Log.d(TAG,"oncreate");
		
		// 커스텀 타이블 바를 설정 한다.
		Window window = getWindow();
		window.requestFeature(Window.FEATURE_CUSTOM_TITLE);
		
		setContentView(R.layout.activity_send_me_main);
		
		window.setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.custom_title_bar_02);

		sendMeMainActivityForUpldate = SendMeMainActivity.this;
		
		
		// 타이틀바의 메인 메뉴 버튼을 설정 한다.
		imageButtonTopMainMenu = (ImageButton)findViewById(R.id.imageButtonTopMainMenu);
		imageButtonTopMainMenu.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				Log.i(TAG, "pressed top main menu.");
				
				// 메인 메뉴 화면을 출력 한다.
				Intent i = new Intent(SendMeMainActivity.this, SendMeMainMenuActivity.class);
				startActivity(i);
			}
		});
		
		
		// 안읽은 메시지수
		mainUnreadCountTxt = (TextView) findViewById(R.id.mainUnreadCountTxt);
		
		
		// 슬라이드 버튼 - 받기 / 보내기
		slidingDrawerFrom = (SlidingDrawer) findViewById(R.id.slidingDrawerFrom);	
		slidingDrawerTo = (SlidingDrawer) findViewById(R.id.slidingDrawerTo);	
		// 리스너
		slidingDrawerFrom.setOnDrawerOpenListener(new OnDrawerOpenListener() {
			@Override
			public void onDrawerOpened() {
				// TODO Auto-generated method stub
				Log.d(TAG,"slidingDrawerFrom onDrawerOpened");

				// 새 액티비티 호출하고 버튼은 초기화
				Intent i = new Intent(SendMeMainActivity.this, SendMeReceiveVoiceListActivity.class);
				startActivity(i);
				slidingDrawerFrom.close();
			}
		});
		slidingDrawerTo.setOnDrawerOpenListener(new OnDrawerOpenListener() {
			@Override
			public void onDrawerOpened() {
				// TODO Auto-generated method stub
				Log.d(TAG,"slidingDrawerTo onDrawerOpened");

				// 새 액티비티 호출하고 버튼은 초기화
				Intent i = new Intent(SendMeMainActivity.this, SendMeFriendActivity.class);
				startActivity(i);
				slidingDrawerTo.close();
			}
		});
		
		
		// 액티비티 매니저에 담는다.
		sendMeActivityManager.addActivity(this);
		
		// 설정파일을 가져 온다.
		this.confirmNotification();
		
		// 로깅.
		mHandler.sendMessage(mHandler.obtainMessage(THREAD_REGISTER_LOG));
		
		
		
		// 서버로부터 설치한 사용자 전화번호를 받아서 SQLite 에 저장한다   - 보류. ### 
		mHandler.sendMessage(mHandler.obtainMessage(THREAD_SELECT_INSTALL_LIST));		// 테스트 중
		
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.send_me_main, menu);
		return true;
	}
	
	@Override
	protected void onStart() {
		super.onStart();
		confirmNotification();
		Log.i(TAG, "PHONE_NUMBER : " + PHONE_NUMBER);
	}

	/**
	 * Handler 를 정의 한다.
	 * 모든 Thread 를 등록해 놓고 호출 한다.
	 */
	private Handler mHandler = new Handler() {
		@Override
		public void handleMessage(Message msg) {
			switch(msg.what) {
			
			// 로그를 남긴다
			case THREAD_REGISTER_LOG : 
				threadRegisterLog();
				break;
			// 앱을 종료하는 alert 창을 띄운다.
			case ALERT_DIALOG_EXIT_ID : 
				showDialogSystemExit();
				break;
			// 앱을 설치한 사용자 목록을 가져와서 SQLite에 저장한다
			case THREAD_SELECT_INSTALL_LIST : 
				threadSelectInstallListAndSaveToSQlite();
				break;
				// 안읽은 메시지 표시한다
			case THREAD_SHOW_UNREAD_MESSAGE_COUNT : 
				runOnUiThread(showUnreadMessageCount);
				break;
				// 프로그레스 바를 출력 한다.
				case THREAD_PROGRESS_BAR_VISIBLE : 
					dialog = ProgressDialog.show(SendMeMainActivity.this, "", "Wait..", true);
					break;
				// 프로그레스 바를 감춘다.
				case THREAD_PROGRESS_BAR_INVISIBLE : 
					dialog.dismiss();
					break;
			}
		}
	};
	
	
	
	/**
	 * 음성 재생 준비
	 */
	private Runnable showUnreadMessageCount = new Runnable() {
		@Override
		public void run() {
			// 안읽은 메시지 수
			SendMeCommon sendMeCommon = new SendMeCommon();
			unreadCount = sendMeCommon.badgeCountPrefLoad(returnThis());
			mainUnreadCountTxt.setText(unreadCount+"");
		}
	};
	
	
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 서버 통신
	/**
	 * 앱을 설치한 사용자 목록을 가져와서 SQLite에 저장한다. 
	 *   --> 전체 전화번호부 목록을 저장하도록 수정. 저장시 installYn 값으로 설치 여부를 함께 저장
	 *   
	 *   동기화 후 sqlite 에 저장하는 부분이라서 sendMeCommon.selectPhoneBookAddress 호출함.
	 */
	public void threadSelectInstallListAndSaveToSQlite() {

		Thread thread = new Thread(new Runnable() {

			public void run() {
				// TODO Auto-generated method stub

				mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_VISIBLE));
				
				SendMeInstall sendMeInstall = new SendMeInstall();
				sendMeInstall.setActivateYn("Y");
				sendMeInstall.setSendMeMemberPhoneNumber(PHONE_NUMBER);
				SendMeInstallRest sendMeInstallRest = new SendMeInstallRest();
				List<SendMeInstall> result = sendMeInstallRest.selectInstallList(sendMeInstall);		// 전번, 닉네임 (서버)// 보낼때 082, 01 처리해서 받을때도 처리된것 받음
				
				// 전번, 이름 (내 전화번호부)
				SendMeCommon sendMeCommon = new SendMeCommon();
				ArrayList<SendMeFriend> phoneBookFriendList = sendMeCommon.selectPhoneBookAddress(returnThis());		// 폰북. 082, 01 처리됨  
				
				// 초기화
				for(int j=0; j<phoneBookFriendList.size(); j++){
					phoneBookFriendList.get(j).setNickName("");
					phoneBookFriendList.get(j).setInstallYn("N");
				}
				// 동기화. 전번이 같으면 이름을 가져와서 세팅
				for(int i=0; i<result.size(); i++){
					SendMeInstall tempSendMeInstall = result.get(i);
					
					// 전번이 같으면 추가 정보 세팅
					for(int j=0; j<phoneBookFriendList.size(); j++){
						SendMeFriend tempSendMeFriend = phoneBookFriendList.get(j);
						if(tempSendMeInstall.getPhoneNumber().equals(tempSendMeFriend.getPhoneNumber())){
							phoneBookFriendList.get(j).setNickName(result.get(i).getNickName());
							phoneBookFriendList.get(j).setInstallYn("Y");
						}
					}
				}
				
				// DB에 저장..		setPhoneNumber 되어 있다.  -- 무조건 저장.
				SendMeDBManagerInstallUser sendMeDBManagerInstallUser = new SendMeDBManagerInstallUser(returnThis());
				boolean sqliteResult = sendMeDBManagerInstallUser.insertAppInstallUser(phoneBookFriendList);	// List<SendMeFriend> sendMeFriendList
				if(sqliteResult){
					Log.d(TAG,"Success to save App Install User at SQLite");
				}else{
					Log.d(TAG,"Fail to save App Install User at SQLite");
				}
				
				
				mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_INVISIBLE));
			}
		});
		thread.start();
	}
	
	/**
	 * 로그를 남긴다	 
	 */
	public void threadRegisterLog() {
		Thread thread = new Thread(new Runnable() {
			public void run() {
				
				SendMeCommon sendMeCommon = new SendMeCommon();
				String nowTime = sendMeCommon.getCurrentDate();
				
				SendMeLog sendMeLog = new SendMeLog();
				sendMeLog.setPhoneNumber(PHONE_NUMBER);
				sendMeLog.setViewName(TAG);
				sendMeLog.setRegisterDate(nowTime);
				
				SendMeLogRest sendMeLogRest = new SendMeLogRest();
				
				sendMeLogRest.registerLog(sendMeLog);
			}
		});
		thread.start();
	}
	
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////	

	// 컨텍스트 반환
	public Context returnThis(){
		return this;
	}
	
	/**
	 * SharedPreference 정보를 확인 한다.
	 */
	public void confirmNotification() {
		SharedPreferences mSharedPreference = getSharedPreferences(SendMeConstant.SENDME_PREFERENCE, Activity.MODE_PRIVATE);
		
		MASTER_PASSWORD = mSharedPreference.getString("master_password", "");
		PUBLIC_PASSWORD = mSharedPreference.getString("public_password", "");
		FUNCTION_MODE = mSharedPreference.getString("function_mode", "");
		PHONE_NUMBER = mSharedPreference.getString("phone_number", "");
	}
	
	/**
	 * SharedPreference 에 상태를 저장한다 (받은 메시지 리스트 열림)
	 *  푸시 받아서 업데이트 용도
	 */
	public void savePrefMainOpened() {
		// 저장
		SharedPreferences sharedPreferences = getSharedPreferences(SendMeConstant.SENDME_PREFERENCE, Activity.MODE_PRIVATE);
		SharedPreferences.Editor editor = sharedPreferences.edit();
		editor.putBoolean("main_open_yn", true);
		editor.commit();
	}
	/**
	 * SharedPreference 에 상태를 저장한다 (받은 메시지 리스트 닫힘)
	 *  푸시 받아서 업데이트 용도
	 */
	public void savePrefMainClosed() {
		// 저장
		SharedPreferences sharedPreferences = getSharedPreferences(SendMeConstant.SENDME_PREFERENCE, Activity.MODE_PRIVATE);
		SharedPreferences.Editor editor = sharedPreferences.edit();
		editor.putBoolean("main_open_yn", false);
		editor.commit();
	}
	
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	// 닫기 관련
	
	
	
	/**
	 * 뒤로 가기 버튼을 정의 한다.
	 * 메인화면이기 때문에 뒤로가기 버튼을 터치하면 앱을 종료 한다.
	 */
	@Override
	public void onBackPressed() {
		// TODO Auto-generated method stub
		mHandler.sendMessage(mHandler.obtainMessage(ALERT_DIALOG_EXIT_ID));
	}
	
	/**
	 * 뒤로가기 버튼을 터치하면 alert 창을 띄우고 앱을 종료한다.
	 */
	private void showDialogSystemExit() {
		new AlertDialog.Builder(SendMeMainActivity.this)
		.setTitle("프로그램 종료")
		.setMessage("SendMe 를 종료하시겠습니까?")
		.setNegativeButton("취소", new DialogInterface.OnClickListener() {

			@Override
			public void onClick(DialogInterface dialog, int which) {

			}
		})
		.setPositiveButton("확인", new DialogInterface.OnClickListener() {
			
			@Override
			public void onClick(DialogInterface dialog, int which) {
				// TODO Auto-generated method stub
				
				// 뱃지 업뎃 먼저..
				SendMeCommon sendMeCommon = new SendMeCommon();
				sendMeCommon.badgeCountAutoSet(returnThis());
				
				// 전체 종료
				sendMeActivityManager.finishAllActivity();
			}
		}).show();
	}
	
	@Override
	public void onResume(){
		super.onResume();
		
		// 메인 화면 열림
		savePrefMainOpened();		// selectPrefMainOpened main_open_yn
		mHandler.sendMessage(mHandler.obtainMessage(THREAD_SHOW_UNREAD_MESSAGE_COUNT));
	}
	
	@Override
	public void onStop(){
		super.onStop();
		
		// 메인 화면 닫힘
		savePrefMainClosed();
	}

}
